package hu.mapro.flang.gwt.client.ui;

 
public class UserPrivilegesEditor { // implements hu.mapro.gwtui.gxt.client.fieldseditor.field.EditorFieldInterface<Set<UserPrivilege>> {

//	// TODO set factory
//	Supplier<UserPrivilege> factory;
//	private Setter<UserPrivilege, Object> parentSetter;
//	
//	private ListStore<Privilege> fromStore;
//	private ListStore<Privilege> toStore;
//	private DualListField<Privilege, String> dualListField;
//	private EditorDelegate<Set<UserPrivilege>> delegate;
//
//
//	@SuppressWarnings({ "unchecked", "rawtypes" })
//	public UserPrivilegesEditor(
//			Supplier<UserPrivilege> factory, 
//			Setter<UserPrivilege, ?> parentSetter
//	) {
//		this.factory = factory;
//		this.parentSetter = (Setter)parentSetter;
//		fromStore = new ListStore<Privilege>(GxtDataUtils.<Privilege>enumModelKeyProvider());
//		toStore = new ListStore<Privilege>(GxtDataUtils.<Privilege>enumModelKeyProvider());
//		
//		StoreSortInfo<Privilege> sortInfo = new StoreSortInfo<Privilege>(Ordering.<Privilege>natural(), SortDir.ASC);
//		fromStore.addSortInfo(sortInfo);
//		toStore.addSortInfo(sortInfo);
//		
//		dualListField = new DualListField<Privilege, String>(fromStore, toStore, new ToStringValueProvider<Privilege>(), new TextCell());
//		dualListField.setEnableDnd(true);
//		dualListField.setMode(Mode.APPEND);
//		
//		fromStore.replaceAll(Arrays.asList(Privilege.values()));
//	}
//	
//	@Override
//	public void setDelegate(final EditorDelegate<Set<UserPrivilege>> delegate) {
//		this.delegate = delegate;
//		
//		dualListField.setDelegate(new EditorDelegate<List<Privilege>>() {
//
//			@Override
//			public String getPath() {
//				return delegate.getPath();
//			}
//
//			@Override
//			public void recordError(String message, Object value,
//					Object userData) {
//				delegate.recordError(message, value, userData);
//			}
//
//			@Override
//			public void setDirty(boolean dirty) {
//				delegate.setDirty(dirty);
//			}
//
//			@Override
//			public HandlerRegistration subscribe() {
//				return delegate.subscribe();
//			}
//		});
//	}
//
//	Map<Privilege, UserPrivilege> map = Maps.newHashMap();
//
//	private Object baseObject;
//
//	private Set<UserPrivilege> value;
//	private Setter<Object, Set<UserPrivilege>> accessor;
//	
//	Set<Privilege> originalValue;
//	
//
//	private UserPrivilege getUserPrivilege(Privilege p) {
//		UserPrivilege up = map.get(p);
//		
//		if (up==null) {
//			up = factory.get();
//			parentSetter.set(up, baseObject);
//			up.setPrivilege(p);
//			map.put(p, up);
//		}
//		
//		return up;
//	}
//
//	@Override
//	public Widget asWidget() {
//		return dualListField;
//	}
//
//	@Override
//	public void focus() {
//	}
//
//	@SuppressWarnings({ "unchecked", "rawtypes" })
//	@Override
//	public <T, A extends Getter<T, Set<UserPrivilege>> & Setter<T, Set<UserPrivilege>>> void edit(
//			A accessor, T baseObject) {
//		this.baseObject = baseObject;
//		this.accessor = (Setter)accessor;
//		
//		value = accessor.get(baseObject);
//		
//		//originalValue = getPrivileges(value);
//		
//		map.clear();
//		if (value!=null) {
//			for (UserPrivilege up : value) {
//				map.put(up.getPrivilege(), up);
//			}
//		}
//
//		toStore.replaceAll(Lists.newArrayList(map.keySet()));
//		
//		originalValue = Sets.newEnumSet(toStore.getAll(), Privilege.class);
//		
//		List<Privilege> fromValues = Lists.newArrayList(Privilege.values());
//		fromValues.removeAll(toStore.getAll());
//		fromStore.replaceAll(fromValues);
//	}
//
//	@Override
//	public void flush() {
//		if (value==null) {
//			value = Sets.newHashSet();
//			accessor.set(baseObject, value);
//		} else {
//			value.clear();
//		}
//		
//		for (Privilege p : toStore.getAll()) {
//			value.add(getUserPrivilege(p));
//		}
//	}
//
//	@Override
//	public void checkDirty() {
//		delegate.setDirty(!Objects.equal(Sets.newEnumSet(toStore.getAll(), Privilege.class), originalValue));
//	}

}
